import time
import _thread

'''
    异步callback
    注意: 不要在Sublime直接运行, 会看不到多线程执行结果, 得去cmd执行或用SublimeREPL
'''

# 取这个名字很耗时
def get_name():
    time.sleep(5)
    return 'xiaoming'

# 这里我们假设这次long_io的目的是去获取一个名字
def long_io(callback):
    """将耗时的操作交给另一线程来处理"""
    def fun(cb):  # 回调函数作为参数
        """耗时操作"""
        print("开始执行IO操作")
        io_result = get_name()                  # 这个io_result就是异步的结果, 咱折腾那么久其实就是为了得到它
        print("完成IO操作，并执行回调函数")
        # 执行回调函数, 这里相当于on_finish(io_result)
        cb(io_result)
    _thread.start_new_thread(fun, (callback,))  # 开启线程执行耗时操作


def on_finish(ret):
    """回调函数"""
    print("开始执行回调函数on_finish")
    print("The name is : %s" % ret)
    print("完成执行回调函数on_finish")


def req_a():
    print('开始处理请求req_a')
    long_io(on_finish)
    print('离开处理请求req_a')


def req_b():
    print('开始处理请求req_b')
    time.sleep(2)                               # 添加此句来突出显示程序执行的过程
    print('完成处理请求req_b')


def main():
    req_a()
    req_b()

if __name__ == "__main__":
    main()
